home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1996 January: Mac OS SDK / Dev.CD Jan 96 SDK / Dev.CD Jan 96 SDK1.toast / Development Kits (Disc 1) / AOCE / Development Tools / Sample Code / Messaging Service Access Module / Internet PMSAM / Internet PMSAM source / spoolfromaoce.c < prev    next >
Encoding:
C/C++ Source or Header  |  1993-10-20  |  9.2 KB  |  383 lines  |  [TEXT/MPS ]

  1. /*-------------------------------------------------------------------
  2.  
  3. AOCE Post Office Protocol (POP) / Simple Mail Transfer Protocol (SMTP)
  4. Mail Service Access Module
  5.  
  6. written by Steve Falkenburg-- MacDTS
  7. ©1991-1993 Apple Computer, Inc.
  8.  
  9. --------------
  10. change history
  11. --------------
  12.  
  13. SJF        02/19/93    update for beta build    b1
  14. SJF        10/29/92    update to a11            a11
  15. SJF        06/08/92    update to a8            a8
  16. SJF        02/15/92    first working version    a4.5
  17. SJF        10/16/91    initial coding            a3
  18.  
  19. ---------------------------------------------------------------------*/
  20.  
  21. #ifndef __TYPES__
  22. #include <Types.h>
  23. #endif
  24.  
  25. #ifndef __OCE__
  26. #include <OCE.h>
  27. #endif
  28.  
  29. #ifndef __OCEMAIL__
  30. #include <OCEMail.h>
  31. #endif
  32.  
  33. #include "const.h"
  34. #include "gwerrors.h"
  35. #include "mytypes.h"
  36. #include "globals.h"
  37. #include "utils.h"
  38. #include "spoolsystem.h"
  39. #include "gatewaystuff.h"
  40.  
  41. #include "spoolfromaoce.h"
  42.  
  43.  
  44. OSErr SpoolFromAOCE(MailMsgRef mailRef,FSSpec *spoolSpec)
  45. {
  46.     OSErr err;
  47.  
  48.     // put message data into spool file
  49.     
  50.     err = SpoolAttributesFromAOCE(spoolSpec,mailRef);
  51.     if (err!=noErr) {
  52.         RemoveSpoolFile(spoolSpec);
  53.         return err;
  54.     }
  55.  
  56.     err = SpoolAddressFromAOCE(spoolSpec,mailRef);
  57.     if (err!=noErr) {
  58.         RemoveSpoolFile(spoolSpec);
  59.         return err;
  60.     }
  61.  
  62.     err = SpoolContentsFromAOCE(spoolSpec,mailRef);
  63.     if (err!=noErr) {
  64.         RemoveSpoolFile(spoolSpec);
  65.         return err;
  66.     }
  67.     
  68.     return noErr;
  69. }
  70.  
  71.  
  72. OSErr SpoolAttributesFromAOCE(FSSpec *spoolSpec,MailMsgRef mailRef)
  73. {
  74.     OSErr err;
  75.     MSAMGetAttributesPB gwp;
  76.     MailAttributeBitmap reqBitmap;
  77.     MaximumLetterAttributes attrib;
  78.     long *clrBitmap;
  79.     char *attribPtr;
  80.     
  81.     
  82.     // get attributes from letter
  83.     
  84.     clrBitmap = (long *)&reqBitmap;
  85.     *clrBitmap = 0L;
  86.     
  87.     reqBitmap.letterID = reqBitmap.replyID = reqBitmap.conversationID = reqBitmap.sendTimeStamp =
  88.         reqBitmap.indications = reqBitmap.subject = 1;
  89.             
  90.     attribPtr = (char *)&attrib;
  91.     
  92.     gwp.ioCompletion = (ProcPtr)MSAMCompletion;
  93.     gwp.mailMsgRef = mailRef;
  94.     gwp.requestMask = reqBitmap;
  95.     gwp.buffer.bufferSize = sizeof(MaximumLetterAttributes);
  96.     gwp.buffer.buffer = attribPtr;
  97.     gwp.more = false;
  98.     
  99.     MSAMGetAttributes((MSAMParam *)&gwp,true);
  100.     err = WaitPBDone(&gwp);
  101.     if (err!=noErr)
  102.         return err;
  103.     
  104.     // spool received attributes to disk
  105.     
  106.     if (gwp.responseMask.letterID) {
  107.         err = SpoolToFile(spoolSpec,kLetterIDType,kAttribCreator,0,attribPtr,sizeof(MailLetterID));
  108.         if (err!=noErr)
  109.             return err;
  110.         attribPtr += sizeof(MailLetterID);
  111.     }
  112.     
  113.     if (gwp.responseMask.replyID) {
  114.         err = SpoolToFile(spoolSpec,kReplyIDType,kAttribCreator,0,attribPtr,sizeof(MailLetterID));
  115.         if (err!=noErr)
  116.             return err;
  117.         attribPtr += sizeof(MailLetterID);
  118.     }
  119.  
  120.     if (gwp.responseMask.conversationID) {
  121.         err = SpoolToFile(spoolSpec,kConversationIDType,kAttribCreator,0,attribPtr,sizeof(MailLetterID));
  122.         if (err!=noErr)
  123.             return err;
  124.         attribPtr += sizeof(MailLetterID);
  125.     }
  126.  
  127.     if (gwp.responseMask.sendTimeStamp) {
  128.         err = SpoolToFile(spoolSpec,kSendTimeType,kAttribCreator,0,attribPtr,sizeof(MailTime));
  129.         if (err!=noErr)
  130.             return err;
  131.         attribPtr += sizeof(MailTime);
  132.     }
  133.  
  134.     if (gwp.responseMask.indications) {
  135.         err = SpoolToFile(spoolSpec,kIndicationsType,kAttribCreator,0,attribPtr,sizeof(MailIndications));
  136.         if (err!=noErr)
  137.             return err;
  138.         attribPtr += sizeof(MailIndications);
  139.     }
  140.  
  141.     if (gwp.responseMask.subject) {
  142.         err = SpoolToFile(spoolSpec,kSubjectType,kAttribCreator,0,attribPtr,sizeof(RString));
  143.         if (err!=noErr)
  144.             return err;
  145.         attribPtr += sizeof(RString);
  146.     }
  147. }
  148.  
  149.  
  150. OSErr SpoolAddressFromAOCE(FSSpec *spoolSpec,MailMsgRef mailRef)
  151. {
  152.     OSErr err;
  153.     
  154.     // spool resolved addresses
  155.     
  156.     err = SpoolGenericAddressFromAOCE(spoolSpec,mailRef,kMailResolvedList);
  157.     if (err!=noErr)
  158.         return err;
  159.     
  160.     // spool from
  161.         
  162.     err = SpoolGenericAddressFromAOCE(spoolSpec,mailRef,kMailFromBit);
  163.     if (err!=noErr)
  164.         return err;
  165.     
  166.     // spool to
  167.         
  168.     err = SpoolGenericAddressFromAOCE(spoolSpec,mailRef,kMailToBit);
  169.     if (err!=noErr)
  170.         return err;
  171.     
  172.     // spool cc
  173.         
  174.     err = SpoolGenericAddressFromAOCE(spoolSpec,mailRef,kMailCcBit);
  175.     if (err!=noErr)
  176.         return err;
  177.     
  178.     // spool bcc
  179.         
  180.     err = SpoolGenericAddressFromAOCE(spoolSpec,mailRef,kMailBccBit);
  181.     if (err!=noErr)
  182.         return err;
  183.     
  184.     return err;
  185. }
  186.  
  187.  
  188. OSErr SpoolGenericAddressFromAOCE(FSSpec *spoolSpec,MailMsgRef mailRef,MailAttributeID attrID)
  189. {
  190.     OSErr err;
  191.     MSAMGetRecipientsPB gwp;
  192.     short index,procIndex,numRecipients,internalRecipIndex;
  193.     OSType spoolType;
  194.     OriginalRecipientReply *origBlock;
  195.     ResolvedRecipientReply *resolvedBlock;
  196.     MailOriginalRecipientExt *origPtr;
  197.     MailResolvedRecipientExt *resolvedPtr;
  198.     Ptr ptrData,recipientPtr;
  199.     Boolean doingResolved;
  200.     short reportIndex = 0;
  201.     
  202.     ptrData = NewPtrChk(kMaxRecipSize);
  203.     if (MemError()!=noErr)
  204.         return MemError();
  205.         
  206.     doingResolved = false;
  207.     origBlock = (OriginalRecipientReply *) ptrData;
  208.     resolvedBlock = (ResolvedRecipientReply *) ptrData;
  209.     
  210.     switch (attrID) {
  211.         case kMailResolvedList:
  212.             doingResolved = true;
  213.             spoolType = kResolvedRecType;
  214.             break;
  215.         case kMailFromBit:
  216.             spoolType = kFromType;
  217.             break;
  218.         case kMailToBit:
  219.             spoolType = kToType;
  220.             break;
  221.         case kMailCcBit:
  222.             spoolType = kCCType;
  223.             break;
  224.         case kMailBccBit:
  225.             spoolType = kBCCType;
  226.             break;
  227.         default:
  228.             DisposPtrChk(ptrData);
  229.             return kUnexpectedAOCECondition;
  230.     }
  231.     
  232.     gwp.ioCompletion = (ProcPtr)MSAMCompletion;
  233.     gwp.mailMsgRef = mailRef;
  234.     gwp.attrID = attrID;
  235.     gwp.startIndex = 1;
  236.     gwp.buffer.buffer = ptrData;
  237.     gwp.buffer.bufferSize = kMaxRecipSize;
  238.     gwp.more = true;    // start at true to kick-start for loop
  239.     gwp.nextIndex = 1;
  240.     
  241.     err = noErr;
  242.     for (index=1; gwp.more==true && err==noErr; index=gwp.nextIndex) {
  243.  
  244.         gwp.startIndex = gwp.nextIndex;    // get next recipient
  245.  
  246.         MSAMGetRecipients((MSAMParam *)&gwp,true);
  247.         err = WaitPBDone(&gwp);
  248.         if (err!=noErr) {
  249.             DisposPtrChk(ptrData);
  250.             return err;
  251.         }
  252.         
  253.         recipientPtr = ptrData + sizeof(short);
  254.         numRecipients = origBlock->reply.tupleCount;
  255.         for (procIndex=0; procIndex<numRecipients && err==noErr; procIndex++) {
  256.             if (doingResolved) {
  257.                 resolvedPtr = (MailResolvedRecipientExt *)recipientPtr;
  258.                 internalRecipIndex = resolvedPtr->ext.index;
  259.                 recipientPtr += (sizeof(MailResolvedRecipient)+sizeof(short)+resolvedPtr->packedRecip.dataLength);
  260.                 if ((unsigned long)recipientPtr % 2)
  261.                     recipientPtr++;
  262.                 if (resolvedPtr->ext.responsible) {
  263.                     err = SpoolSingleRecipient(spoolSpec,spoolType,procIndex,&resolvedPtr->packedRecip);
  264.                     if (err==noErr) {
  265. //
  266. //    **NOTE** this is different from previous builds!
  267. //             you now need to use the procIndex+index for the index instead of internalRecipientIndex!
  268. //
  269.                         err = SpoolRecipientReport(spoolSpec,procIndex+index,reportIndex++);
  270.                     }
  271.                 }
  272.             }
  273.             else {
  274.                 origPtr = (MailOriginalRecipientExt *)recipientPtr;
  275.                 internalRecipIndex = origPtr->ext.index;
  276.                 recipientPtr += (sizeof(MailOriginalRecipient)+sizeof(short)+origPtr->packedRecip.dataLength);
  277.                 if ((unsigned long)recipientPtr % 2)
  278.                     recipientPtr++;
  279.                 err = SpoolSingleRecipient(spoolSpec,spoolType,procIndex,&origPtr->packedRecip);
  280.             }
  281.         }
  282.     }
  283.     
  284.     DisposPtrChk(ptrData);
  285.     return err;
  286. }
  287.  
  288.  
  289. OSErr SpoolRecipientReport(FSSpec *spoolSpec,short recipIndex,short myIndex)
  290. {
  291.     OSErr err;
  292.     
  293.     err = SpoolToFile(spoolSpec,kRecipientType,kReportCreator,myIndex,(Ptr)&recipIndex,(unsigned long)sizeof(short));
  294.     return err;
  295. }
  296.  
  297.  
  298. OSErr SpoolSingleRecipient(FSSpec *spoolSpec,OSType spoolType,short index,OCEPackedRecipient *pRecip)
  299. {
  300.     OSErr err;
  301.  
  302.     err = SpoolToFile(spoolSpec,spoolType,kAddrCreator,index,(Ptr)pRecip,(unsigned long)pRecip->dataLength+sizeof(short));
  303.     return err;
  304. }
  305.  
  306.  
  307. OSErr SpoolContentsFromAOCE(FSSpec *spoolSpec,MailMsgRef mailRef)
  308. {
  309.     MSAMGetContentPB gwp;
  310.     Ptr dataBuffer;
  311.     StScrpRec *textScrap;
  312.     OSErr err;
  313.     Boolean startOfBlock;
  314.     OSType spoolType;
  315.     unsigned short blockIndex;
  316.     
  317.     // allocate data buffer
  318.     
  319.     dataBuffer = NewPtr(kMaxBufferSize);
  320.     if (MemError()!=noErr)
  321.         return MemError();
  322.  
  323.     // allocate scrap record
  324.     
  325.     textScrap = (StScrpRec *)NewPtr(sizeof(StScrpRec));
  326.     if (MemError()!=noErr)
  327.         return MemError();
  328.  
  329.     // fill in our parameter block
  330.     
  331.     gwp.ioCompletion = (ProcPtr)MSAMCompletion;
  332.     gwp.mailMsgRef = mailRef;
  333.     gwp.buffer.buffer = dataBuffer;
  334.     gwp.buffer.bufferSize = kMaxBufferSize;
  335.     gwp.segmentMask = kMailTextSegmentMask | kMailPictSegmentMask | kMailSoundSegmentMask | 
  336.                         kMailMovieSegmentMask;    // spool everything except styled text
  337.     gwp.textScrap = textScrap;
  338.  
  339.     // read all of the letter blocks
  340.     
  341.     startOfBlock = true;
  342.     blockIndex = 0;
  343.     do {
  344.         textScrap->scrpNStyles = sizeof(ScrpSTTable)/sizeof(ScrpSTElement);
  345.         gwp.segmentID = 0;
  346.         MSAMGetContent((MSAMParam *)&gwp,true);
  347.         err = WaitPBDone(&gwp);
  348.         if ((err==noErr) && (gwp.buffer.dataSize>0)) {
  349.             switch (gwp.segmentType) {
  350.                 case kMailTextSegmentType:
  351.                     spoolType = kTextContent;
  352.                     break;
  353.                 case kMailPictSegmentType:
  354.                     spoolType = kPictContent;
  355.                     break;
  356.                 case kMailSoundSegmentType:
  357.                     spoolType = kSoundContent;
  358.                     break;
  359.                 case kMailStyledTextSegmentType:
  360.                     spoolType = kStyledTextContent;
  361.                     break;
  362.                 case kMailMovieSegmentType:
  363.                     spoolType = kMovieContent;
  364.                     break;
  365.             }
  366.             if (startOfBlock) {
  367.                 SpoolToFile(spoolSpec,spoolType,kContentCreator,blockIndex,gwp.buffer.buffer,gwp.buffer.dataSize);
  368.                 startOfBlock = false;
  369.             }
  370.             else
  371.                 AppendToSpool(spoolSpec,spoolType,kContentCreator,blockIndex,gwp.buffer.buffer,gwp.buffer.dataSize);
  372.             if (gwp.endOfSegment==true) {
  373.                 startOfBlock = true;
  374.                 blockIndex++;
  375.             }
  376.         }
  377.     } while ((err==noErr) && (gwp.endOfContent==false));
  378.     
  379.     DisposPtrChk((Ptr)textScrap);
  380.     DisposPtrChk(dataBuffer);
  381.  
  382.     return err;
  383. }